<?php
namespace app\attachment\controller;

use app\common\controller\Front;

class Index extends Front
{
    public function _initialize()
    {
        $this->request->filter('trim,strip_tags,htmlspecialchars');
        
        parent::_initialize();
    }
    
    //首页
    public function index()
    {
        return $this->fetch();
    }
    
    //按ID查询
    public function id()
    {
        //ID参数
        if(!$val = input('val/d',0)){
            $this->error(lang('mustIn'));
        }
        //查询数据
        $info = model('common/Info','loglic')->get([
            'cache'  => true,
            'status' => 'normal',
            'module' => 'attachment',
            'with'   => 'info_meta',
            'id'     => $val,
        ]);
        //公共入口
        $this->detail($info);
    }
    
    //按slug查询
    public function slug()
    {
        //ID参数
        if(!$val = input('val/s')){
            $this->error(lang('mustIn'));
        }
        //查询数据
        $info = model('common/Info','loglic')->get([
            'cache'  => true,
            'status' => 'normal',
            'module' => 'attachment',
            'with'   => 'info_meta',
            'slug'   => $val,
        ]);
        //公共入口
        $this->detail($info);
    }
    
    //按path查询
    public function path()
    {
        //ID参数
        if(!$val = input('val/s')){
            $this->error(lang('mustIn'));
        }
        //查询数据
        $info = model('common/Info','loglic')->get([
            'cache'   => true,
            'status'  => 'normal',
            'module'  => 'attachment',
            'with'    => 'info_meta',
            'excerpt' => $val,
        ]);
        //公共入口
        $this->detail($info);
    }
    
    /*public function fields()
    {
        $fields = db('info')->getTableInfo('','fields');
        $fieldsMeta = model('common/Info','loglic')->metaKeys('attachment','detail');
        dump(DcArrayArgs($fieldsMeta, $fields));
    }*/
    
    //公用detail
    private function detail($info=[])
    {
        if(!$info){
            $this->error(lang('empty'));
        }
        if(!$info['info_mime_type']){
            $this->error(lang('attachment/error/mimeType'));
        }
        //附件不同状态（0=关闭；1=直接跳转；2=动态显示）
        if(config('common.attachment') == 1){
            //附件积分处理
            $this->scoreCheck($info['info_id'],$info['attachment_score']);
            //附件为绝对地址
            if(parse_url($info['info_excerpt'], PHP_URL_SCHEME)){
                $this->redirect($info['info_excerpt'], 302);
            }
            //附件为相对地址（本地上传）
            config('url_html_suffix',false);
            //是否CDN配置
            if(config('common.upload_cdn')){
                $this->redirect(trim(config('common.upload_cdn')).$info['info_excerpt'], 302);
            }else{
                $this->redirect($this->site['path_root'].trim(config('common.upload_path')).'/'.$info['info_excerpt'], 302);
            }
        }elseif(config('common.attachment') == 2){
            //附件积分处理
            $this->scoreCheck($info['info_id'],$info['attachment_score']);
            //附件为绝对地址
            if( parse_url($info['info_excerpt'], PHP_URL_SCHEME) ){
                if($result=attachmentCurlBrowser($info['info_excerpt'], $info['info_title'], $info['info_mime_type'])){
                    exit($result);
                }
            }
            //附件为相对地址（有CDN配置）
            if( config('common.upload_cdn') ){
                if($result=attachmentCurlBrowser(trim(config('common.upload_cdn')).$info['info_excerpt'], $info['info_title'], $info['info_mime_type'])){
                    exit($result);
                }
            }
            //附件为相对地址（加载本地附件）
            if($result=attachmentSendBrowser($info['info_excerpt'], $info['info_title'], $info['info_mime_type'])){
                exit($result);
            }
            //发送错误信息
            header('Content-Type: text/plain');
            exit(lang(config('daicuo.error')));
        }else{
            exit(lang('off'));
        }
    }
    
    /**
     * 附件积分处理
     * @param int $infoId 附件ID
     * @param int $infoScore 所需积分
     * @return obj 文件流
     */
    private function scoreCheck($infoId=0, $infoScore=0)
    {
        //积分处理开关
        if($infoScore < 1){
            return true;
        }
        //未安装USER插件
        if(!function_exists('userScoreDec')){
            $this->error(lang('attachment/error/system'));
        }
        //判断用户是否登录
        if( !$this->site['user']['user_id'] ){
            $this->error(lang('attachment/error/needLogin'), 'user/login/index');
        }
        //是否已经购买过了
        if( attachmentGetScore($this->site['user']['user_id'], $infoId) ){
            return true;
        }
        //用户积分是否足够扣除本次请求
        if($infoScore > $this->site['user']['user_score']){
            $this->error(lang('attachment/error/scoreLess'), 'user/recharge/index');
        }
        //根据扣点设置扣除用户的积分
        if(!userScoreDec($this->site['user']['user_id'], $infoScore)){
            $this->error(lang('attachment/error/system'));
        }
        //增加积分消费记录
        attachmentSetScore($this->site['user']['user_id'], $infoId, $infoScore*-1);
    }
}